/* Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.database;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import it.dei.unipd.healthservice.resource.*;

/**
 * Visualizza i clienti
 * 
 * @author Nicola Salmaso
 * @version 1.00
 */
public class ViewClientiDatabase {
	/**
	 * Interrogazione al database
	 */
	private static final String STATEMENT = "SELECT * FROM cliente;";
	/**
	 * Interrogazione al database
	 */
	private static final String GET_CLIENTE_STATEMENT = "SELECT * FROM cliente WHERE mail=?;";
	/**
	 * Connessione al database
	 */
	private final Connection con;
	/**
	 * Risultati della ricerca
	 */
	private final List<Cliente> clienti;

	/**
	 * Ricerca tutti i clienti
	 * 
	 * @param con
	 * connessione al database.
	 */
	public ViewClientiDatabase(Connection con) {
		this.con = con;
		clienti = new ArrayList<Cliente>();
	}
	/**
	 * Cerca i clienti
	 * 
	 * @return una lista di clienti.
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public List<Cliente> search() throws SQLException {

		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try {
			pstmt = con.prepareStatement(STATEMENT);
			rs = pstmt.executeQuery();
			while (rs.next())
				try{
					clienti.add(new Cliente(rs.getBoolean("isprivato"), rs.getString("cognome"),
								rs.getString("nome"),rs.getString("cf"),rs.getString("piva"),rs.getString("indirizzo"),
								rs.getString("cap"), rs.getString("citta"), rs.getString("provincia"), rs.getString("stato"),
								rs.getString("tel"), rs.getString("mail"), rs.getString("password"), rs.getBoolean("confermato")));
				}catch (IllegalArgumentException e){}
		}
		finally {
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			con.close();
		}
		return clienti;
	}
	
	/**
	 * Cerca i clienti
	 * 
	 * @return una lista di clienti.
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public Cliente getCliente(String email) throws SQLException {

		PreparedStatement pstmt = null;
		ResultSet rs = null;
		Cliente cliente = null;

		try {
			pstmt = con.prepareStatement(GET_CLIENTE_STATEMENT);
			pstmt.setString(1, email);
			rs = pstmt.executeQuery();
			while (rs.next())
				try{
					cliente = new Cliente(rs.getBoolean("isprivato"), rs.getString("cognome"),
								rs.getString("nome"),rs.getString("cf"),rs.getString("piva"),rs.getString("indirizzo"),
								rs.getString("cap"), rs.getString("citta"), rs.getString("provincia"), rs.getString("stato"),
								rs.getString("tel"), rs.getString("mail"), rs.getString("password"), rs.getBoolean("confermato"));
				}catch (IllegalArgumentException e){}
		}
		finally {
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			con.close();
		}
		return cliente;
	}
}